package co.gov.medellin.sdep.sisdep.model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.object.MappingSqlQuery;
import org.springframework.jdbc.object.SqlUpdate;

import co.gov.medellin.sdep.sisdep.model.DesElementoRetenido;
import co.gov.medellin.sdep.sisdep.model.OperDesmonteRet;

public class DesElementoRetenidoDAOImpl extends JdbcDaoSupport implements
		IDesElementoRetenidoDAO {

	private InsertOperation insertOperation;

	private UpdateOperation updateOperation;

	private DeleteOperation deleteOperation;

	private DeleteByPrimaryKey deleteByPrimaryKey;

	private FindByPrimaryKeyQuery findByPrimaryKeyQuery;

	private FindByCriteriaQuery findByCriteriaQuery;

	private FindAllQuery findAllQuery;

	private FindByActiveStateQuery findByActiveStateQuery;

	private static final String SELECT = "SELECT * FROM OPE_DES_ELEMENTO_RETENIDO_T ";
	private static final String WHERE = " WHERE ";
	private static final String PARAMETER = " ?, ";

	public void delete(DesElementoRetenido deselementoretenido) {
		deleteOperation.execute(deselementoretenido);
	}

	public void deleteByPrimaryKey(long id) {
		deleteByPrimaryKey.execute(id);
	}

	public DesElementoRetenido findByPrimaryKey(long login) {
		return findByPrimaryKeyQuery.runQuery(login);
	}

	public void insert(DesElementoRetenido deselementoretenido) {
		insertOperation.execute(deselementoretenido);
	}

	public void update(DesElementoRetenido deselementoretenido) {
		updateOperation.execute(deselementoretenido);
	}

	public DesElementoRetenido findByCriteria(
			DesElementoRetenido deselementoretenido) {
		return findByCriteriaQuery.runQuery(deselementoretenido);
	}

	public List load() {
		//METODO COMENTADO POR UN FUTURO USO, SE REEMPLAZO SU USO EN EL METODO SIGUIENTE LOADALL()
		return null;
	}
	
	public List loadAll(OperDesmonteRet operdesmonteret) {
		return findAllQuery.runQuery(operdesmonteret);
	}

	public DesElementoRetenido findByActiveState(
			DesElementoRetenido deselementoretenido) {
		return findByActiveStateQuery.runQuery(deselementoretenido);
	}

	public void initDao() {
		insertOperation = new InsertOperation(getDataSource());
		updateOperation = new UpdateOperation(getDataSource());
		deleteOperation = new DeleteOperation(getDataSource());
//		deleteByPrimaryKey = new DeleteByPrimaryKey(getDataSource());
//		findByPrimaryKeyQuery = new FindByPrimaryKeyQuery(getDataSource());
//		findByCriteriaQuery = new FindByCriteriaQuery(getDataSource());
		findAllQuery = new FindAllQuery(getDataSource());
//		findByActiveStateQuery = new FindByActiveStateQuery(getDataSource());
	}

	// ------------- SaveOperation ---------------------------------------
	class InsertOperation extends SqlUpdate {
		private static final String sql = "INSERT INTO OPE_DES_ELEMENTO_RETENIDO_T ("
				+ " ID, "
				
				+ " ID_RETENCION, "
				
				+ " CODIGO, "
				
				+ " ID_ELEMENTO_RETENIDO, "
				
				+ " CANTIDAD, "
				+ " ESTADO, "
				+ " OBSERVACIONES, "
				+ " USUARIO_CREA, "
				
				+ " FECHA_CREA "
				+ ") VALUES ("
				
				+ " OPE_DES_ELEMENTO_RET_SEC.nextVal, "
				
				+ PARAMETER
				
				+ PARAMETER
				
				+ PARAMETER
				
				+ PARAMETER
				+ PARAMETER
				+ PARAMETER
				+ PARAMETER
				
				+ " SYSDATE " 
				+ ")";

		public InsertOperation(DataSource ds) {
			super(ds, sql);
			// set here required parameters
			declareParameter(new SqlParameter(Types.INTEGER));
			
			declareParameter(new SqlParameter(Types.CHAR));
			
			declareParameter(new SqlParameter(Types.INTEGER));
			
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			
			compile();
		}

		public void execute(DesElementoRetenido deselementoretenido) {
			InsertOperation.this.update(new Object[] {
					deselementoretenido.getIdRetencion(),
					
					deselementoretenido.getCodigo(),
					
					deselementoretenido.getIdElementoRetenido(),
					
					deselementoretenido.getCantidad(),
					deselementoretenido.getEstado(),
					deselementoretenido.getObservaciones(),
					deselementoretenido.getUsuarioCrea() 
					});
		}
	}

	// ------------- UpdateOperation -------------------------------------
	class UpdateOperation extends SqlUpdate {
		private static final String sql = "UPDATE OPE_DES_ELEMENTO_RETENIDO_T SET "
				+ " CODIGO = ? ,"
				+ " ID_ELEMENTO_RETENIDO = ? ,"
				+ " CANTIDAD = ? ,"
				+ " ESTADO = ? ,"
				+ " OBSERVACIONES = ? ,"
				+ " USUARIO_MODIFICA = ? ," 
				+ " FECHA_MODIFICA = SYSDATE " 
				+ WHERE
				+ " ID = ? ";

		public UpdateOperation(DataSource ds) {
			super(ds, sql);
			// set here required parameters
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.INTEGER));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.CHAR));
			declareParameter(new SqlParameter(Types.INTEGER));
			compile();
		}

		public void execute(DesElementoRetenido deselementoretenido) {
			UpdateOperation.this.update(new Object[] {
					deselementoretenido.getCodigo(),
					deselementoretenido.getIdElementoRetenido(),
					deselementoretenido.getCantidad(),
					deselementoretenido.getEstado(),
					deselementoretenido.getObservaciones(),
					deselementoretenido.getUsuarioModifica(),
					deselementoretenido.getId()
					});
		}
	}

	// ------------- DeleteOperation -------------------------------------
	class DeleteOperation extends SqlUpdate {
		private static final String sql = "DELETE FROM OPE_DES_ELEMENTO_RETENIDO_T "
				+ WHERE + " ID = ? ";

		public DeleteOperation(DataSource ds) {
			super(ds, sql);
			declareParameter(new SqlParameter(Types.CHAR));
			compile();
		}

		public void execute(DesElementoRetenido deselementoretenido) {
			this.update(new Object[] { deselementoretenido.getId(), });
		}
	}

	// ------------- DeleteByPrimaryKey ----------------------------------
	class DeleteByPrimaryKey extends SqlUpdate {
		private static final String sql = "DELETE FROM OPE_DES_ELEMENTO_RETENIDO_T "
				+ WHERE;

		public DeleteByPrimaryKey(DataSource ds) {
			super(ds, sql);
			compile();
		}

		public void execute(long id) {
			this.update(new Object[] {});
		}
	}

	// ---- BaseQueryOperation for Mapping ResultSet values --------------
	abstract class BaseQueryOperation extends MappingSqlQuery {
		public BaseQueryOperation(DataSource ds, String sql) {
			super(ds, sql);
		}

		protected Object mapRow(ResultSet rs, int rownum) throws SQLException {
			DesElementoRetenido deselementoretenido = new DesElementoRetenido();
			deselementoretenido.setId(new Long(rs.getLong("ID")));
			deselementoretenido.setIdRetencion(new Long(rs
					.getLong("ID_RETENCION")));
			deselementoretenido.setCodigo(rs.getString("CODIGO"));
			deselementoretenido.setIdElementoRetenido(new Long(rs
					.getLong("ID_ELEMENTO_RETENIDO")));
			deselementoretenido.setCantidad(rs.getString("CANTIDAD"));
			deselementoretenido.setEstado(rs.getString("ESTADO"));
			deselementoretenido.setObservaciones(rs.getString("OBSERVACIONES"));
			deselementoretenido.setUsuarioCrea(rs.getString("USUARIO_CREA"));
			deselementoretenido.setFechaCrea(rs.getDate("FECHA_CREA"));
			deselementoretenido.setUsuarioModifica(rs
					.getString("USUARIO_MODIFICA"));
			deselementoretenido.setFechaModifica(rs.getDate("FECHA_MODIFICA"));
			return deselementoretenido;
		}
	}

	// ------------- FindByPrimaryKeyQuery -------------------------------
	class FindByPrimaryKeyQuery extends BaseQueryOperation {
		private static final String sql = SELECT + WHERE;

		public FindByPrimaryKeyQuery(DataSource ds) {
			super(ds, sql);
			compile();
		}

		public DesElementoRetenido runQuery(long id) {
			List result = execute(new Object[] { new Long(id) });
			if (result.size() > 0) {
				return (DesElementoRetenido) result.get(0);
			} else {
				return null;
			}
		}
	}

	// ------------- FindByCriteriaQuery ---------------------------------
	class FindByCriteriaQuery extends BaseQueryOperation {
		private static final String sql = SELECT + WHERE + " 1=1 ";

		// For required criteria elements uncomment required values
		// + " AND ID = ? "
		// + " AND ID_RETENCION = ? "
		// + " AND CODIGO = ? "
		// + " AND ID_ELEMENTO_RETENIDO = ? "
		// + " AND CANTIDAD = ? "
		// + " AND ESTADO = ? "
		// + " AND OBSERVACIONES = ? "
		// + " AND USUARIO_CREA = ? "
		// + " AND FECHA_CREA = ? "
		// + " AND USUARIO_MODIFICA = ? "
		// + " AND FECHA_MODIFICA = ? "
		// + "";
		public FindByCriteriaQuery(DataSource ds) {
			super(ds, sql);
			// For required criteria elements uncomment required values
			// declareParameter( new SqlParameter(Types.INTEGER) );
			// declareParameter( new SqlParameter(Types.INTEGER) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.INTEGER) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.DATE) );
			// declareParameter( new SqlParameter(Types.CHAR) );
			// declareParameter( new SqlParameter(Types.DATE) );
			compile();
		}

		public DesElementoRetenido runQuery(
				DesElementoRetenido deselementoretenido) {
			List result = execute(new Object[] {
			// For required criteria elements uncomment required values
			// deselementoretenido.getId(),
			// deselementoretenido.getIdRetencion(),
			// deselementoretenido.getCodigo(),
			// deselementoretenido.getIdElementoRetenido(),
			// deselementoretenido.getCantidad(),
			// deselementoretenido.getEstado(),
			// deselementoretenido.getObservaciones(),
			// deselementoretenido.getUsuarioCrea(),
			// deselementoretenido.getFechaCrea(),
			// deselementoretenido.getUsuarioModifica(),
			// deselementoretenido.getFechaModifica(),
			});
			if (result.size() > 0) {
				return (DesElementoRetenido) result.get(0);
			} else {
				return null;
			}
		}
	}

	// ------------- FindAllQuery ----------------------------------------
	class FindAllQuery extends BaseQueryOperation {
		private static final String sql = SELECT 
										+ WHERE
										+ " 1=1 "
										+ "AND ID_RETENCION = ?";

		public FindAllQuery(DataSource ds) {
			super(ds, sql);
			declareParameter(new SqlParameter(Types.INTEGER));
			compile();
		}

		public List runQuery(OperDesmonteRet operdesmonteret) {
			List result = execute(new Object[] {
					operdesmonteret.getId()
			});
			if (result.size() > 0) {
				return result;
			} else {
				return null;
			}
		}
	}

	// ------------- FindByActiveStateQuery -----------------------------
	class FindByActiveStateQuery extends BaseQueryOperation {
		private static final String sql = SELECT + WHERE;

		public FindByActiveStateQuery(DataSource ds) {
			super(ds, sql);
			compile();
		}

		public DesElementoRetenido runQuery(
				DesElementoRetenido deselementoretenido) {
			List result = execute(new Object[] {});
			if (result.size() > 0) {
				return (DesElementoRetenido) result.get(0);
			} else {
				return null;
			}
		}
	}

}
